package com.fancy;

/**
 * @author chaigq
 * @version 1.0
 * @date 2021/5/20 11:36 下午
 */
public class VirtualOldGenerationTouchOff {

    public static void main(String[] args) {
        // “-XX:PretenureSizeThreshold=3145728” 设置⼤对象阈值为3MB，也就是超过3MB，就直接进⼊⽼年代。
        // 产生一个4M的对象，直接进入老年代
        byte[] array1 = new byte[4 * 1024 * 1024];
        // array1 不再引用这个对象
        array1 = null;
        // 连续分配了4个数组，其中3个是2MB的数组，1个是128KB的数组，全部会进⼊Eden区域中
        byte[] array2 = new byte[2 * 1024 * 1024];
        byte[] array3 = new byte[2 * 1024 * 1024];
        byte[] array4 = new byte[2 * 1024 * 1024];
        byte[] array5 = new byte[128 * 1024];
        // Eden区已经放不下了，此时会触发⼀次Young GC。
        // [ParNew (promotion failed): 7819K->8385K(9216K), 0.0032945 secs]0.107
        // Eden区原来是有7000多KB的对象，但是回收之后发现⼀个都回收不掉，因为上述⼏个数组都被变量引⽤了
        // [CMS: 8194K->6656K(10240K), 0.0037701 secs] 11915K->6656K(19456K)
        // 是在Young GC之后，先把2个2MB的数组放⼊了⽼年代
        // 此时要继续放1个2MB的数组和1个128KB的数组到⽼年代，⼀定会放不下，所以此时就会触发CMS的Full GC
        byte[] array6 = new byte[2 * 1024 * 1024];
    }
}
